home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / cli / mx2src.arc / NETWORK.MOD < prev    next >
Text File  |  1989-01-05  |  28KB  |  853 lines

  1.  
  2. (*              Copyright 1987 fred brooks LogicTek             *)
  3. (*                                                              *)
  4. (*                                                              *)
  5. (*   First Release                      12/8/87-FGB             *)
  6. (*                                                              *)
  7.  
  8. IMPLEMENTATION MODULE NETWORK ;
  9.  
  10. (* --------------------------------------------------------------------------
  11.  
  12.                NETWORK : MIDI PORT TWO CPU NETWORK FOR TDI Modula-2/ST
  13.  
  14.    --------------------------------------------------------------------------*)
  15.  
  16. (*$T-,$S-,$A+ *)
  17.  
  18. FROM SYSTEM IMPORT ADDRESS, ADR, SETREG, CODE, REGISTER ,BYTE ,TSIZE;
  19. FROM BIOS   IMPORT BPB ,BConStat ,BConIn, BCosStat, BConOut, Device,
  20.                    MediaChange,MCState,GetBPB,RWAbs,RW,DriveSet,DriveMap;
  21. FROM XBIOS  IMPORT SuperExec,IORec,IORECPTR,IOREC,SerialDevice;
  22. FROM GEMDOS IMPORT TermRes,Open,Close ;
  23. IMPORT             GEMDOS;
  24. FROM ASCII  IMPORT SYN,STX,SOH,BEL;
  25.  
  26. CONST
  27.   MaxSeq          = 1;
  28.   recsize         = 511;
  29.   USER            = 324159265;
  30.   retry           = 10;
  31.   debug           = FALSE;
  32.   trace           = FALSE;
  33.  
  34.   (* Because we dont know what registers the BIOS is using we must use
  35.      the following opcodes to save the registers *)
  36.   MOVEMDEC = 48E7H ;    (* 68000 opcode for MOVEM <regs>,-(A7) *)
  37.   MOVEMINC = 4CDFH ;    (* 68000 opcode for MOVEM (A7)+,<regs> *)
  38.   SAVEREGS = 07FFCH ;   (* Registers D1..A5 for DEC *)
  39.   RESTREGS = 03FFEH ;   (* Registers D1..A5 for INC *)
  40.   RTS = 04E75H ;        (* 68000 return from subroutine opcode *)
  41.  
  42. TYPE
  43.   (* Procedure types to mimic correct sequence for "C" BIOS routines *)
  44.  
  45.   CBPBProc     = PROCEDURE ( CARDINAL ) ;
  46.   CMediaChProc = PROCEDURE ( CARDINAL ) ;
  47.   CRWAbsProc   = PROCEDURE ( CARDINAL, CARDINAL, CARDINAL, ADDRESS, CARDINAL );
  48.   MIDIbuffer   = ARRAY [0..512] OF CARDINAL;
  49.   SequenceNr   = [0..MaxSeq];
  50.   message      = ARRAY [0..recsize] OF BYTE;
  51.   message1     = ARRAY [0..17] OF BYTE;
  52.   FrameKind    = (ack,data,callreq,callaccp,clearreq,clearconf,
  53.                  resetreq,resetconf,diag);
  54.   DataKind     = (rdmediareq,rdmediaconf,rdbpbreq,rdbpbconf,
  55.                  rdrwabsreq,rdrwabsconf);
  56.   evtype       = (framearrival,cksumerr,timeout,hostready,reset,nothing);
  57.  
  58.   frame        = RECORD
  59.                  syn    :       CHAR; (* these are sync chars *)
  60.                  stx    :       CHAR; (* for the frames       *)
  61.                  kind   :       FrameKind;
  62.                  seq    :       SequenceNr;
  63.                  ack    :       SequenceNr;
  64.                  cmd    :       DataKind;
  65.                  rw     :       CARDINAL; (* read or write data *)
  66.                  recno  :       CARDINAL; (* sector for data*)
  67.                  d0     :       LONGCARD; (* data return variable *)
  68.                  info   :       message;
  69.                  user   :       LONGCARD;
  70.                  cksum  :       CARDINAL;
  71.                END;
  72.  
  73.   framecptr    = POINTER TO framecmd;
  74.   framecmd     = RECORD
  75.                  syn    :       CHAR; (* these are sync chars *)
  76.                  stx    :       CHAR; (* for the frames       *)
  77.                  kind   :       FrameKind;
  78.                  seq    :       SequenceNr;
  79.                  ack    :       SequenceNr;
  80.                  cmd    :       DataKind;
  81.                  rw     :       CARDINAL; (* read or write data *)
  82.                  recno  :       CARDINAL; (* sector for data*)
  83.                  d0     :       LONGCARD; (* data return variable *)
  84.                  info   :       message1;
  85.                  user   :       LONGCARD;
  86.                  cksum  :       CARDINAL;
  87.                END;
  88.  
  89.   control     = RECORD
  90.                  magic          :       LONGCARD;
  91.                  reset          :       BOOLEAN;
  92.                  networkactive  :       BOOLEAN;
  93.                  remotedrive    :       CARDINAL;
  94.                  drivemap       :       DriveSet;
  95.                 nextframetosend :      SequenceNr;
  96.                 frameexpected   :      SequenceNr;
  97.                 sendreset       :      BOOLEAN;
  98.                END;
  99.  
  100.   consave     = RECORD
  101.                  magic          :       LONGCARD;
  102.                  reset          :       BOOLEAN;
  103.                  networkactive  :       BOOLEAN;
  104.                 END;
  105.  
  106.   frameptr      =       POINTER TO ARRAY [0..1024] OF BYTE;
  107.  
  108. VAR
  109.  
  110.  
  111.   (* BIOS variables : These can only be accessed with the 68000 in supervisor
  112.      mode. The Modula-2 language allows you to fix the location of variables *)
  113.  
  114.   HDBPB     [0472H] : ADDRESS ;       (* hard disk get Bios Parameter Block *)
  115.   HDRWAbs   [0476H] : ADDRESS ;       (* hard disk read/write abs   *)
  116.   HDMediaCh [047EH] : ADDRESS ;       (* hard disk media change     *)
  117.   DriveBits [04C2H] : SET OF [0..31]; (* disk drives present map    *)
  118.   flock     [043EH] : LONGCARD;       (* disk access in progress    *)
  119.   hz200     [04baH] : LONGCARD;       (* 200hz clock counter        *)
  120.   clock             : LONGCARD;
  121.   Dptr              : DriveSet;       (* save original drive map    *)
  122.   Mptr              : LONGCARD;
  123.   charcount,j,framesize,cksum,recframesize,sndframesize,
  124.   SIZEframe,SIZEframecmd                                : CARDINAL;
  125.  
  126.   networkconnect          :   BOOLEAN; (* DCD = 1 TRUE  *)
  127.   gotframe                :   BOOLEAN;
  128.   framebufferfull         :   BOOLEAN;
  129.   cleartosend             :   BOOLEAN;
  130.   readytosend             :   BOOLEAN;
  131.   requesttosend           :   BOOLEAN;
  132.   framewaiting            :   BOOLEAN;
  133.   timer,OK,installed      :   BOOLEAN;
  134.   gotmediach              :   ARRAY [0..5] OF BOOLEAN;
  135.   gotbpb                  :   ARRAY [0..5] OF BOOLEAN;
  136.   networkerror            :   BOOLEAN;
  137.   shortframe              :   BOOLEAN;
  138.   sendlong                :   BOOLEAN;
  139.  
  140.   sframe,rframe,SFRAME,RFRAME,
  141.   nframe1,nframe2                  :   frame;
  142.   rframeptr,sframeptr,
  143.   bpbptr,nbpbptr                   :   frameptr;
  144.   framecmdptr,framecmdptr1         :   framecptr;
  145.   event                            :   evtype;
  146.   C                                :   control;
  147.   recchar,timestart,timefortimeout,timeouttime :   LONGCARD;
  148.   timestart1,timefortimeout1,timeouttime1      :   LONGCARD;
  149.   result,r,i,i1,i2,i3,mediacount,handle        :   INTEGER;
  150.   D0ptr                                        :   POINTER TO LONGCARD;
  151.   wsector,drvnr,DriveA,DriveF,devicestart,d,R  :   CARDINAL;
  152.   rbuffer                                      :   MIDIbuffer;
  153.   rbptr                                        :   IORECPTR;
  154.   numBytes,sec,min,hour,time,count             :   LONGCARD ;
  155.   status                                       :   LONGINT ;
  156.  
  157.   (* The following are saved copies of the BIOS variables so that the real
  158.      hard disk routines can be called if a hard disk access is requested. *)
  159.  
  160.   SaveHDBPB      : CBPBProc ;     (* hard disk get Bios Parameter Block *)
  161.   SaveHDRWAbs    : CRWAbsProc ;   (* hard disk read/write abs *)
  162.   SaveHDMediaCh  : CMediaChProc ; (* hard disk media change *)
  163.  
  164.   (* NETWORK control *)
  165.  
  166.   NetworkBPB  : ARRAY [0..5] OF BPB ; (* BIOS Parameter block for NETWORK *)
  167.  
  168. PROCEDURE MoveMemory ( From, To : ADDRESS ; Bytes : LONGCARD ) ;
  169. (* This routine shows how time critical portions of code can be optimised to
  170.    run faster. It relys on the code generation rules of the compiler which 
  171.    can be checked by dis-assembling the link file with DecLnk.*)
  172.  
  173. CONST
  174.   MOVEB = 12D8H ;       (*      MOVE.B  (A0)+,(A1)+     *)
  175.   MOVEL = 22D8H ;       (*      MOVE.L  (A0)+,(A1)+     *)
  176.   A0    = 0+8 ;         (* register A0 *)
  177.   A1    = 1+8 ;         (* register A1 *)
  178.  
  179. BEGIN
  180.   SETREG(A0,From) ;             (* load From pointer into A0 *)
  181.   SETREG(A1,To) ;               (* load To pointer into A1 *)
  182.   
  183.   IF ( ODD(From) OR ODD(To) ) THEN      (* must do bytes *)
  184.     WHILE ( Bytes <> 0 ) DO
  185.       CODE(MOVEB) ;
  186.       DEC(Bytes) ;
  187.     END ;
  188.   ELSE (* even addresses so can do long moves *)
  189.     WHILE ( Bytes > 3 ) DO
  190.       CODE(MOVEL) ;
  191.       DEC(Bytes,4) ;
  192.     END ;
  193.     WHILE ( Bytes <> 0 ) DO
  194.       CODE(MOVEB) ;             (* clean up remainder *)
  195.       DEC(Bytes) ;
  196.     END ;
  197.   END ;
  198. END MoveMemory ;
  199.  
  200.  
  201. PROCEDURE inc(VAR k: SequenceNr);   (* increment k circular